﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
internal static class Messager
{  //只在这个包可用   //消息派发管理中心
    public static Dictionary<GameEvent, Delegate> mEventTable = new Dictionary<GameEvent, Delegate>();
    //检测是否已经有了监听的类型， 是否符合监听的类型
    private static bool OnAddListener(GameEvent eventType, Delegate handler)
    {
        if (!mEventTable.ContainsKey(eventType))
        {   //如果不包含传入的监听
            mEventTable.Add(eventType, null);
        }
        //GetType 方法返回 Type 对象，该对象表示由其完全限定名指定的类型。
        Delegate d = mEventTable[eventType];  //当前字典中已经存在的
        if (d != null && d.GetType() != handler.GetType())
        {
            Debug.LogError("a");
            return false;
        }
        return true;
    }
    public static void ClearAllMessage()
    {
        mEventTable.Clear();
    }
    private static bool OnRemoveListener(GameEvent eventType, Delegate hangler)
    {
        if (mEventTable.ContainsKey(eventType))
        {
            Delegate d = mEventTable[eventType];
            if (d == null)
            {
                Debug.LogError("null");
                return false;
            }
            else if (d.GetType() != hangler.GetType())
            {
                Debug.LogError("类型不符合");
                return false;
            }
        }
        else
        {
            //Debug.LogError("不包含要移除的对象");
            return false;
        }
        return true;
    }
    //添加监听
    public static void AddListener(GameEvent eventType, CallBack handler)
    {
        if (!OnAddListener(eventType, handler))
        {
            return;
        }
        mEventTable[eventType] = (CallBack)mEventTable[eventType] + handler;  //将方法加进去
    }

    public static void AddListener<T>(GameEvent eventType, CallBack<T> handler)
    {
        if (!OnAddListener(eventType, handler))
        {
            return;
        }
        mEventTable[eventType] = (CallBack<T>)mEventTable[eventType] + handler;
    }

    public static void AddListener<T,K>(GameEvent eventType,CallBack<T,K> handler)
    {
        if(!OnAddListener(eventType,handler))
        {
            return;
        }
        mEventTable[eventType] = (CallBack<T, K>)mEventTable[eventType] + handler;
    }

    //移除监听    
    public static void RemoveListener(GameEvent eventType, CallBack handler)
    {
        if (!OnRemoveListener(eventType, handler))
        {
            return;
        }
        mEventTable[eventType] = (CallBack)mEventTable[eventType] - handler;
        if (mEventTable[eventType] == null)
        {
            mEventTable.Remove(eventType);
        }
    }
    public static void RemoveListener<T>(GameEvent eventType, CallBack<T> handler)
    {
        if (!OnRemoveListener(eventType, handler))
        {
            return;
        }
        mEventTable[eventType] = (CallBack<T>)mEventTable[eventType] - handler;
        if (mEventTable[eventType] == null)
        {
            mEventTable.Remove(eventType);
        }
    }

    /// <summary>
    /// 移除两个参数的事件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="K"></typeparam>
    /// <param name="eventType"></param>
    /// <param name="handler"></param>
    public static void RemoveListener<T,K>(GameEvent eventType, CallBack<T,K> handler)
    {
        if (!OnRemoveListener(eventType, handler))
        {
            return;
        }
        mEventTable[eventType] = (CallBack<T,K>)mEventTable[eventType] - handler;
        if (mEventTable[eventType] == null)
        {
            mEventTable.Remove(eventType);
        }
    }

    //广播监听
    public static void Broadcast(GameEvent eventType)
    {
        if (!mEventTable.ContainsKey(eventType))
        {  //不包含要广播的监听
            return;
        }
        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {   //d为一个函数
            CallBack callback = d as CallBack;
            if (callback != null)
            {
                callback();
            }
            else
            {
                Debug.LogError("广播" + eventType + "为空");
            }
        }
    }
    public static void Broadcast<T>(GameEvent eventType, T arg1)
    {
        if (!mEventTable.ContainsKey(eventType))
        {
            return;
        }
        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            CallBack<T> callback = d as CallBack<T>;
            if (callback != null)
            {
                callback(arg1);
            }
            else
            {
                Debug.LogError("广播" + eventType + "为空");
            }
        }
    }
    public static void Broadcast<T,K>(GameEvent eventType, T arg1,K arg2)
    {
        if (!mEventTable.ContainsKey(eventType))
        {
            return;
        }
        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            CallBack<T, K> callback = d as CallBack<T, K>;
            if (callback != null)
            {
                callback(arg1,arg2);
            }
            else
            {
                Debug.LogError("广播" + eventType + "为空");
            }
        }
    }
}
